package com.zenithmind.coding.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.coding.mapper.ProblemMapper.ProblemStatistics;
import com.zenithmind.coding.mapper.ProblemMapper.TagStatistics;
import com.zenithmind.coding.mapper.ProblemMapper.UserSolveStatistics;
import com.zenithmind.coding.pojo.dto.ProblemCreateDTO;
import com.zenithmind.coding.pojo.entity.Problem;
import com.zenithmind.coding.pojo.vo.ProblemVO;

import java.util.List;

/**
 * 编程问题服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ProblemService extends IService<Problem> {

    /**
     * 创建问题
     * 
     * @param createDTO 创建DTO
     * @return 问题VO
     */
    ProblemVO createProblem(ProblemCreateDTO createDTO);

    /**
     * 分页查询问题列表
     * 
     * @param current 当前页
     * @param size 页大小
     * @param categoryId 分类ID
     * @param difficulty 难度等级
     * @param type 问题类型
     * @param status 问题状态
     * @param keyword 关键词
     * @param tags 标签列表
     * @return 分页结果
     */
    PageResult<ProblemVO> getProblemPage(Long current, Long size, String categoryId,
                                        Integer difficulty, Integer type, Integer status,
                                        String keyword, List<String> tags);

    /**
     * 根据ID查询问题详情
     * 
     * @param id 问题ID
     * @param userId 用户ID（用于获取用户相关信息）
     * @return 问题VO
     */
    ProblemVO getProblemById(String id, String userId);

    /**
     * 更新问题
     * 
     * @param id 问题ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     */
    Boolean updateProblem(String id, ProblemCreateDTO updateDTO);

    /**
     * 删除问题
     * 
     * @param id 问题ID
     * @return 是否成功
     */
    Boolean deleteProblem(String id);

    /**
     * 发布问题
     * 
     * @param id 问题ID
     * @return 是否成功
     */
    Boolean publishProblem(String id);

    /**
     * 下架问题
     *
     * @param id 问题ID
     * @return 是否成功
     */
    Boolean unpublishProblem(String id);

    /**
     * 更新问题状态
     *
     * @param id 问题ID
     * @param status 状态
     * @return 是否成功
     */
    Boolean updateProblemStatus(String id, String status);

    /**
     * 审核问题
     * 
     * @param id 问题ID
     * @param approved 是否通过
     * @param comment 审核意见
     * @return 是否成功
     */
    Boolean reviewProblem(String id, Boolean approved, String comment);

    /**
     * 查询推荐问题
     * 
     * @param userId 用户ID
     * @param difficulty 难度等级
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> getRecommendProblems(String userId, Integer difficulty, Integer limit);

    /**
     * 查询热门问题
     * 
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> getHotProblems(Integer limit);

    /**
     * 查询相关问题
     * 
     * @param problemId 问题ID
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> getRelatedProblems(String problemId, Integer limit);

    /**
     * 根据标签查询问题
     * 
     * @param tags 标签列表
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> getProblemsByTags(List<String> tags, Integer limit);

    /**
     * 搜索问题
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> searchProblems(String keyword, Integer limit);

    /**
     * 更新问题统计信息
     * 
     * @param problemId 问题ID
     * @param submitCount 提交次数增量
     * @param acceptCount 通过次数增量
     * @return 是否成功
     */
    Boolean updateProblemStatistics(String problemId, Long submitCount, Long acceptCount);

    /**
     * 更新问题平均性能
     * 
     * @param problemId 问题ID
     * @param avgTime 平均用时
     * @param avgMemory 平均内存
     * @return 是否成功
     */
    Boolean updateProblemAvgPerformance(String problemId, Integer avgTime, Integer avgMemory);

    /**
     * 获取问题统计信息
     * 
     * @param categoryId 分类ID
     * @param difficulty 难度等级
     * @return 统计信息
     */
    ProblemStatistics getProblemStatistics(String categoryId, Integer difficulty);

    /**
     * 获取热门标签
     * 
     * @param limit 限制数量
     * @return 标签列表
     */
    List<TagStatistics> getHotTags(Integer limit);

    /**
     * 获取用户解题统计
     * 
     * @param userId 用户ID
     * @return 解题统计
     */
    UserSolveStatistics getUserSolveStatistics(String userId);

    /**
     * 获取每日挑战问题
     * 
     * @param userId 用户ID
     * @param count 数量
     * @return 问题列表
     */
    List<ProblemVO> getDailyChallenges(String userId, Integer count);

    /**
     * 收藏问题
     * 
     * @param problemId 问题ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean favoriteProblem(String problemId, String userId);

    /**
     * 取消收藏问题
     * 
     * @param problemId 问题ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unfavoriteProblem(String problemId, String userId);

    /**
     * 获取用户收藏的问题
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 问题列表
     */
    List<ProblemVO> getUserFavoriteProblems(String userId, Integer limit);

    /**
     * 批量导入问题
     * 
     * @param problems 问题列表
     * @return 导入成功数量
     */
    Integer batchImportProblems(List<ProblemCreateDTO> problems);

    /**
     * 导出问题
     * 
     * @param problemIds 问题ID列表
     * @return 导出数据
     */
    List<ProblemVO> exportProblems(List<String> problemIds);
}
